import Compile from './Compile'
import observe from './observe'
import Watcher from './Watcher'

export default class Vue {
  constructor (options) {
    // 暴露给用户
    this.$options = options || {}
    // 数据
    // 这里竟然不能用 options?.data
    this._data = options == undefined ? undefined : options.data
    // 传入的data变为响应式的
    observe(this._data)
    this._initData()
    // 用户自定义的监听内容，比如有一个data是hh，
    // 需要在 watch 函数里写同名的hh()
    this._initWatch()
    // // 其他类似的还有
    // this._initComputed()
    // this._initMethods()
    // this._initCreated()
    // 模板编译
    new Compile(options.el, this)
  }

  _initData () {
    let self = this
    Object.keys(this._data).forEach(key => {
      Object.defineProperty(self, key, {
        get () {
          return self._data[key]
        },
        set (newVal) {
          self._data[key] = newVal
        }
      })
    })
  }

  _initWatch () {
    let self = this
    let watchs = this.$options.watch
    // watch 可能用户不会使用，所以要排除
    if (watchs && typeof watchs == 'object') {
      Object.keys(watchs).forEach(keyfn => {
        new Watcher(self, keyfn, watchs[keyfn])
      })
    }
  }
}
